summaryrefslogtreecommitdiff
path: root/app/[lng]/evcp/(evcp)/(procurement)
diff options
context:
space:
mode:
Diffstat (limited to 'app/[lng]/evcp/(evcp)/(procurement)')
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx7
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx7
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx9
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx9
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx15
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx4
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx12
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx6
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx17
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx7
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx6
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx6
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx5
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx6
17 files changed, 102 insertions, 38 deletions
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx b/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx
index 7152bdc2..cb191dd4 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/avl/avl-page-client.tsx
@@ -7,6 +7,8 @@ import { getAvlLists } from "@/lib/avl/service"
import { AvlListItem } from "@/lib/avl/types"
import { toast } from "sonner"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n/client"
+import { useParams } from "next/navigation"
interface AvlPageClientProps {
initialData: AvlListItem[]
@@ -17,6 +19,9 @@ export function AvlPageClient({ initialData }: AvlPageClientProps) {
const [isLoading, setIsLoading] = useState(false)
const [registrationMode, setRegistrationMode] = useState<'standard' | 'project' | null>(null)
+ const params = useParams<{lng: string}>()
+ const lng = params?.lng ?? 'ko'
+ const {t} = useTranslation(lng, 'menu')
// 초기 데이터 설정
useEffect(() => {
setAvlListData(initialData)
@@ -73,7 +78,7 @@ export function AvlPageClient({ initialData }: AvlPageClientProps) {
{/* info button and header section */}
<div className="flex items-center gap-2 mt-2">
<h2 className="text-2xl font-bold tracking-tight">
- AVL(Approved Vendor List) 목록
+ {t('menu.vendor_management.avl_management')}
</h2>
<InformationButton pagePath="evcp/avl" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx
index 66b3ee31..57fceadf 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/basic-contract/page.tsx
@@ -9,15 +9,18 @@ import { getBasicContracts } from "@/lib/basic-contract/service"
import { searchParamsCache } from "@/lib/basic-contract/validations"
import { BasicContractsTable } from "@/lib/basic-contract/status/basic-contract-table"
import { InformationButton } from "@/components/information/information-button"
-
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
const validFilters = getValidFilters(search.filters)
@@ -36,7 +39,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 기본계약서/서약서 관리
+ {t('menu.vendor_management.basic_contract')}
</h2>
<InformationButton pagePath="evcp/basic-contract" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx
index b6c181dc..254fdc13 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-failure/page.tsx
@@ -2,6 +2,7 @@ import { Metadata } from 'next'
import { getBiddingsForFailure } from '@/lib/bidding/service'
import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation'
import { BiddingsFailureTable } from '@/lib/bidding/failure/biddings-failure-table'
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: '폐찰 및 재입찰',
@@ -9,15 +10,19 @@ export const metadata: Metadata = {
}
interface BiddingFailurePageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<Record<string, string | string[] | undefined>>
}
export default async function BiddingFailurePage({
+ params,
searchParams,
}: BiddingFailurePageProps) {
// URL 파라미터 검증
const searchParamsResolved = await searchParams
const search = searchParamsCache.parse(searchParamsResolved)
+ const {lng} = await params
+ const {t} = await useTranslation(lng, 'menu')
// 데이터 조회
const biddingsPromise = getBiddingsForFailure(search)
@@ -26,9 +31,9 @@ export default async function BiddingFailurePage({
<div className="flex flex-col gap-4 p-4">
<div className="flex items-center justify-between">
<div>
- <h1 className="text-2xl font-bold tracking-tight">폐찰 및 재입찰</h1>
+ <h1 className="text-2xl font-bold tracking-tight">{t('menu.procurement.bid_failure')}</h1>
<p className="text-muted-foreground">
- 유찰된 입찰 내역을 확인하고 재입찰을 진행할 수 있습니다.
+ {t('menu.procurement.bid_failure_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx
index 4f6e9715..a087b09f 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-receive/page.tsx
@@ -2,6 +2,7 @@ import { Metadata } from 'next'
import { getBiddingsForReceive } from '@/lib/bidding/service'
import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation'
import { BiddingsReceiveTable } from '@/lib/bidding/receive/biddings-receive-table'
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: '입찰서 접수 및 마감',
@@ -9,15 +10,19 @@ export const metadata: Metadata = {
}
interface BiddingReceivePageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<Record<string, string | string[] | undefined>>
}
export default async function BiddingReceivePage({
+ params,
searchParams,
}: BiddingReceivePageProps) {
// URL 파라미터 검증
const searchParamsResolved = await searchParams
const search = searchParamsCache.parse(searchParamsResolved)
+ const {lng} = await params
+ const {t} = await useTranslation(lng, 'menu')
// 데이터 조회
const biddingsPromise = getBiddingsForReceive(search)
@@ -26,9 +31,9 @@ export default async function BiddingReceivePage({
<div className="flex flex-col gap-4 p-4">
<div className="flex items-center justify-between">
<div>
- <h1 className="text-2xl font-bold tracking-tight">입찰서 접수 및 마감</h1>
+ <h1 className="text-2xl font-bold tracking-tight">{t('menu.procurement.bid_receive')}</h1>
<p className="text-muted-foreground">
- 입찰서 접수 현황을 확인하고 개찰을 진행할 수 있습니다.
+ {t('menu.procurement.bid_receive_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx
index 40b714de..f2fa33cd 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/bid-selection/page.tsx
@@ -1,23 +1,22 @@
-import { Metadata } from 'next'
import { getBiddingsForSelection } from '@/lib/bidding/service'
import { GetBiddingsSchema, searchParamsCache } from '@/lib/bidding/validation'
import { BiddingsSelectionTable } from '@/lib/bidding/selection/biddings-selection-table'
-
-export const metadata: Metadata = {
- title: '입찰선정',
- description: '개찰 이후 입찰가를 확인하고 낙찰업체를 선정할 수 있습니다.',
-}
+import { useTranslation } from "@/i18n"
interface BiddingSelectionPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<Record<string, string | string[] | undefined>>
}
export default async function BiddingSelectionPage({
+ params,
searchParams,
}: BiddingSelectionPageProps) {
// URL 파라미터 검증
const searchParamsResolved = await searchParams
const search = searchParamsCache.parse(searchParamsResolved)
+ const {lng} = await params
+ const {t} = await useTranslation(lng, 'menu')
// 데이터 조회
const biddingsPromise = getBiddingsForSelection(search)
@@ -26,9 +25,9 @@ export default async function BiddingSelectionPage({
<div className="flex flex-col gap-4 p-4">
<div className="flex items-center justify-between">
<div>
- <h1 className="text-2xl font-bold tracking-tight">입찰선정</h1>
+ <h1 className="text-2xl font-bold tracking-tight">{t('menu.procurement.bid_selection')}</h1>
<p className="text-muted-foreground">
- 개찰 이후 입찰가를 확인하고 낙찰업체를 선정할 수 있습니다.
+ {t('menu.procurement.bid_selection_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx
index 973593d8..55dbae32 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/bid/page.tsx
@@ -17,6 +17,7 @@ export const metadata = {
}
interface IndexPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
@@ -24,6 +25,7 @@ export default async function BiddingsPage(props: IndexPageProps) {
// ✅ nuqs searchParamsCache로 파싱 (타입 안전성 보장)
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
+ const {lng} = await props.params
const validFilters = getValidFilters(search.filters)
@@ -42,7 +44,7 @@ export default async function BiddingsPage(props: IndexPageProps) {
{/* ═══════════════════════════════════════════════════════════════ */}
{/* 페이지 헤더 */}
{/* ═══════════════════════════════════════════════════════════════ */}
- <BiddingsPageHeader />
+ <BiddingsPageHeader lng={lng} />
{/* ═══════════════════════════════════════════════════════════════ */}
{/* 메인 테이블 */}
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx
index 51478cc0..635169ce 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/evaluation-input/page.tsx
@@ -12,8 +12,10 @@ import { LogIn } from "lucide-react"
import { getSHIEvaluationSubmissions } from "@/lib/evaluation-submit/service"
import { getSHIEvaluationsSubmitSchema } from "@/lib/evaluation-submit/validation"
import { SHIEvaluationSubmissionsTable } from "@/lib/evaluation-submit/table/submit-table"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
@@ -21,7 +23,9 @@ export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = getSHIEvaluationsSubmitSchema.parse(searchParams)
const validFilters = getValidFilters(search.filters)
-
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
+
// Get session
const session = await getServerSession(authOptions)
@@ -34,7 +38,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 정기평가 입력
+ {t('menu.vendor_management.evaluation_input')}
</h2>
</div>
{/* <p className="text-muted-foreground">
@@ -74,7 +78,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div className="flex items-center justify-between">
<div>
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 정기평가 입력
+ {t('menu.vendor_management.evaluation_input')}
</h2>
</div>
</div>
@@ -104,7 +108,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div className="flex items-center justify-between space-y-2">
<div>
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 정기평가 입력
+ {t('menu.vendor_management.evaluation_input')}
</h2>
{/* <p className="text-muted-foreground">
요청된 정기평가를 입력하고 제출할 수 있습니다.
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx
index 0d3848d9..bf30cfc9 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/evaluation/page.tsx
@@ -24,6 +24,7 @@ import {
type GetEvaluationsSchema
} from "@/lib/evaluation/validation"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: "협력업체 정기평가",
@@ -31,6 +32,7 @@ export const metadata: Metadata = {
}
interface PeriodicEvaluationsPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
@@ -133,6 +135,8 @@ function AggregatedModeNotice({ isAggregated }: { isAggregated: boolean }) {
export default async function PeriodicEvaluationsPage(props: PeriodicEvaluationsPageProps) {
const searchParams = await props.searchParams
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
// ✅ nuqs 기반 파라미터 파싱
const search = searchParamsEvaluationsCache.parse(searchParams)
@@ -156,7 +160,7 @@ export default async function PeriodicEvaluationsPage(props: PeriodicEvaluations
<div className="flex items-center gap-2">
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 정기평가
+ {t('menu.vendor_management.evaluation')}
</h2>
<InformationButton pagePath="evcp/evaluation" />
{/* <ProcessGuidePopover /> */}
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx
index 292ef1cb..59b793ab 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/po/page.tsx
@@ -1,4 +1,4 @@
-import * as React from "react"
+
import { type SearchParams } from "@/types/table"
import { getValidFilters } from "@/lib/data-table"
@@ -9,14 +9,19 @@ import { getVendorPOs } from "@/lib/po/vendor-table/service"
import { vendorPoSearchParamsCache } from "@/lib/po/vendor-table/validations"
import { ShiVendorPoTable } from "@/lib/po/vendor-table/shi-vendor-po-table"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
+import { Suspense } from "react"
interface VendorPOPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
export default async function VendorPONew(props: VendorPOPageProps) {
const searchParams = await props.searchParams
const search = vendorPoSearchParamsCache.parse(searchParams)
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const validFilters = getValidFilters(search.filters)
@@ -34,7 +39,7 @@ export default async function VendorPONew(props: VendorPOPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- PO/계약 관리
+ {t('menu.procurement.po_issuance')}
</h2>
<InformationButton pagePath="evcp/po-new" />
</div>
@@ -42,9 +47,9 @@ export default async function VendorPONew(props: VendorPOPageProps) {
</div>
</div>
- <React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
- </React.Suspense>
- <React.Suspense
+ <Suspense fallback={<Skeleton className="h-7 w-52" />}>
+ </Suspense>
+ <Suspense
fallback={
<DataTableSkeleton
columnCount={8}
@@ -56,7 +61,7 @@ export default async function VendorPONew(props: VendorPOPageProps) {
}
>
<ShiVendorPoTable promises={promises} />
- </React.Suspense>
+ </Suspense>
</Shell>
)
}
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx
index 6a992ee5..e1fcd80d 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/pq_new/page.tsx
@@ -8,12 +8,15 @@ import { searchParamsPQReviewCache } from "@/lib/pq/validations"
import { getPQSubmissions } from "@/lib/pq/service"
import { PQSubmissionsTable } from "@/lib/pq/pq-review-table-new/vendors-table"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
+
export const metadata: Metadata = {
title: "협력업체 PQ/실사 현황",
description: "",
}
interface PQReviewPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
@@ -21,6 +24,8 @@ export default async function PQReviewPage(props: PQReviewPageProps) {
const searchParams = await props.searchParams
const search = searchParamsPQReviewCache.parse(searchParams)
const validFilters = getValidFilters(search.filters)
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
// 디버깅 로그 추가
console.log("=== PQ Page Debug ===");
@@ -71,7 +76,7 @@ export default async function PQReviewPage(props: PQReviewPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 PQ/실사 현황
+ {t('menu.vendor_management.pq_status')}
</h2>
<InformationButton pagePath="evcp/pq_new" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx
index 6830dbe9..223046b7 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/rfq-last/page.tsx
@@ -23,6 +23,7 @@ import { RfqTable } from "@/lib/rfq-last/table/rfq-table";
import { getRfqs } from "@/lib/rfq-last/service";
import { searchParamsRfqCache } from "@/lib/rfq-last/validations";
import { InformationButton } from "@/components/information/information-button";
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: "RFQ 관리",
@@ -30,6 +31,7 @@ export const metadata: Metadata = {
};
interface RfqPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>;
}
@@ -63,6 +65,8 @@ async function getTabCounts() {
export default async function RfqPage(props: RfqPageProps) {
const searchParams = await props.searchParams;
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
// nuqs 기반 파라미터 파싱
const search = searchParamsRfqCache.parse(searchParams);
@@ -89,7 +93,7 @@ export default async function RfqPage(props: RfqPageProps) {
<div className="flex items-center justify-between space-y-2">
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 견적목록관리
+ {t('menu.procurement.budget_rfq')}
</h2>
<InformationButton pagePath="evcp/rfq-last" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx
index c372865e..d2334ba5 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/risk-management/page.tsx
@@ -13,11 +13,13 @@ import { Skeleton } from '@/components/ui/skeleton';
import { Suspense } from 'react';
import { type DateRange } from 'react-day-picker';
import { type SearchParams } from '@/types/table';
+import { useTranslation } from "@/i18n"
// ----------------------------------------------------------------------------------------------------
/* TYPES */
interface RiskManagementPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>;
}
@@ -29,6 +31,8 @@ async function RiskManagementPage(props: RiskManagementPageProps) {
const searchParamsResult = await searchParams;
const search = searchParamsCache.parse(searchParamsResult);
const validFilters = getValidFilters(search.filters);
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
const promises = Promise.all([
getRisksView({
...search,
@@ -52,12 +56,12 @@ async function RiskManagementPage(props: RiskManagementPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 리스크 관리
+ {t('menu.vendor_management.risk_by_agency')}
</h2>
<InformationButton pagePath="evcp/risk-management" />
</div>
<p className="text-muted-foreground">
- 신용평가사 정보를 기반으로 국내 협력업체 리스크를 관리할 수 있습니다.
+ {t('menu.vendor_management.risk_by_agency_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx
index be6debce..04df8e6b 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-candidates/page.tsx
@@ -11,13 +11,17 @@ import { searchParamsCandidateCache } from "@/lib/vendor-candidates/validations"
import { VendorCandidateTable } from "@/lib/vendor-candidates/table/candidates-table"
import { DateRangePicker } from "@/components/date-range-picker"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = searchParamsCandidateCache.parse(searchParams)
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
const validFilters = getValidFilters(search.filters)
@@ -37,7 +41,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 발굴업체 등록 관리
+ {t('menu.vendor_management.candidates')}
</h2>
<InformationButton pagePath="evcp/vendor-candidates" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx
index 1d7786a5..e7109dcb 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-investigation/page.tsx
@@ -10,6 +10,7 @@ import { VendorsInvestigationTable } from "@/lib/vendor-investigation/table/inve
import { getVendorsInvestigation } from "@/lib/vendor-investigation/service"
import { searchParamsInvestigationCache } from "@/lib/vendor-investigation/validations"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
searchParams: Promise<SearchParams>
}
@@ -17,6 +18,8 @@ interface IndexPageProps {
export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = searchParamsInvestigationCache.parse(searchParams)
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
const validFilters = getValidFilters(search.filters)
@@ -35,7 +38,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 실사 관리
+ {t('menu.vendor_management.investigation')}
</h2>
<InformationButton pagePath="evcp/vendor-investigation" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx
index f18716a3..362974df 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-pool/page.tsx
@@ -7,10 +7,16 @@ import { VendorPoolVirtualTable } from "@/lib/vendor-pool/table/vendor-pool-virt
import { Skeleton } from "@/components/ui/skeleton"
import type { VendorPoolItem } from "@/lib/vendor-pool/table/vendor-pool-table-columns"
import { toast } from "sonner"
+import { useTranslation } from "@/i18n/client"
+import { useParams } from "next/navigation"
+
export default function VendorPoolPage() {
const [data, setData] = React.useState<VendorPoolItem[]>([])
const [isLoading, setIsLoading] = React.useState(true)
+ const params = useParams<{lng: string}>()
+ const lng = params?.lng ?? 'ko'
+ const {t} = useTranslation(lng, 'menu')
// 전체 데이터 로드
const loadData = React.useCallback(async () => {
@@ -52,7 +58,7 @@ export default function VendorPoolPage() {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- Vendor Pool
+ {t('menu.vendor_management.vendor_pool')}
</h2>
<InformationButton pagePath="evcp/vendor-pool" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx
index e8433c55..4915edcd 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/vendor-regular-registrations/page.tsx
@@ -10,13 +10,15 @@ import { Shell } from "@/components/shell"
import { fetchVendorRegularRegistrations } from "@/lib/vendor-regular-registrations/service"
import { VendorRegularRegistrationsTable } from "@/lib/vendor-regular-registrations/table/vendor-regular-registrations-table"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
-
-export default async function VendorRegularRegistrationsPage() {
+export default async function VendorRegularRegistrationsPage(props: {params: Promise<{lng: string}>}) {
const promises = Promise.all([
fetchVendorRegularRegistrations(),
])
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
return (
<Shell className="gap-2">
@@ -25,7 +27,7 @@ export default async function VendorRegularRegistrationsPage() {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 정규업체 등록관리
+ {t('menu.vendor_management.vendor_regular_registrations')}
</h2>
<InformationButton pagePath="evcp/vendor-regular-registrations" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx
index fb7bb14c..4a071ee0 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/vendors/page.tsx
@@ -12,13 +12,17 @@ import { getVendors, getVendorStatusCounts } from "@/lib/vendors/service"
import { VendorsTable } from "@/lib/vendors/table/vendors-table"
import { Ellipsis } from "lucide-react"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{lng: string}>
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
+ const {lng} = await props.params
+ const {t} = await useTranslation(lng, 'menu')
const validFilters = getValidFilters(search.filters)
@@ -38,7 +42,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 관리
+ {t('menu.vendor_management.vendors')}
</h2>
<InformationButton pagePath="evcp/vendors" />
</div>